<?php
/**
 * 用户写入数据过滤、验证、转换等
 * 抽象类，不能直接实例化使用，需要在具体的数据项应用中继承此项使用
 *
 * @package Input
 * @author shukyyang
 * @version $Id$
 */
namespace SF;

class Input
{
    // 传入的数据
    protected $_input;
    // 处理后的数据
    protected $_data;
    // 是否有效
    protected $_valid = true;
    // 验证消息
    protected $_message;
    /**
     * 过虑器
     * @var Filter
     */
    protected $_filter = null;
    /**
     * 验证器
     * @var Validator
     */
    protected $_validator = null;

    // 允许的域名
    protected $_allow_list = array();


    public function __construct($input)
    {
        // 传入数据
        $this->_input = $input;

        // 数据初始化构造
        $this->init();
    }

    /**
     * 数据配置项初始化
     */
    public function init()
    {
    }

    /**
     * 添加数据项
     * @param string $name 传入数据Key名
     * @param array $options 操作方式配置
     */
    public function addItem($name, $options)
    {
        // 与数据库或其它存储器字段的映射
        $reflection = empty($options['reflection']) ? $name : $options['reflection'];
        // 数据值
        $value = array_key_exists($name, $this->_input) ?
                $this->_input[$name] :
                (isset($options['default']) ? $options['default'] : null);

        // 过虑
        if ($value && !empty($options['filters'])) {
            $value = \SF\Filter::runFilter($value, $options['filters']);
        }

        // 验证
        if (!empty($options['validators']) && ($value || empty($options['optional']))) {
            if (null === $this->_validator) {
                $this->_validator = new \SF\Validator();
            }
            $this->_validator->setValue($value);
            $this->_valid = $this->_validator->runValidator($options['validators']);
            $this->_message = $this->_validator->getMessage();
        }

        // 转换后的数据
        $this->_data[$reflection] = $value;
    }

    /**
     * 是否有效
     * @return bool
     */
    public function isValid()
    {
        $host = $_SERVER['HTTP_HOST'];
        if (strpos($_SERVER['HTTP_REFERER'], $host) === false && !in_array($host, $this->_allow_list)) {
            $this->_message = 'Invalid Request';
            $this->_valid = false;
        }
        return $this->_valid;
    }

    /**
     * 添加允许域名
     * @param string $list
     */
    public function addAllowList($list)
    {
        $this->_allow_list[] = $list;
    }

    /**
     * 获取消息
     * @return string
     */
    public function getMessage()
    {
        return $this->_message;
    }

    /**
     * 获取处理后的数据
     * @param string $key
     * @return array
     */
    public function getData($key = null)
    {
        if ($key == null) {
            return $this->_data;
        } else {
            if (!key_exists($key, $this->_data)) {
                throw new \SF\Exception($key . ':指定的参数无效');
            }
            return $this->_data[$key];
        }
    }

    /**
     * 设置
     * @param string $key
     * @param mixed $value
     */
    public function __set($key, $value)
    {
        $this->_data[$key] = $value;
    }

    /**
     * 获取
     * @param string $key
     * @return mixed
     */
    public function __get($key)
    {
        return isset($this->_data[$key]) ? $this->_data[$key] : '';
    }

}